var root = {
  value: 1,
  left: null,
  right: {
    value: 2,
    left: {
      value: 3
    }
  } 
}

/**
 * 实现的动态过程是
 * https://leetcode-cn.com/problems/binary-tree-preorder-traversal/solution/er-cha-shu-de-qian-xu-bian-li-by-leetcode-solution/
 * @param {TreeNode} root
 * @return {number[]}
 */
var preorderTraversal = function(root) {
  var res = [];
  var stack = []; // 维护一个遍历节点的栈
  var node = root;
  while (stack.length > 0 || node != null) {
    while (node != null) {
      res.push(node.value); // 把当前节点的值，放到res中
      stack.push(node); // 把这个节点压到栈中，之后会再访问这个节点的右节点
      node = node.left; // 把指针，指向这个节点的左边
    }
    node = stack.pop(); // 当这个节点，没有左子树的时候，就把这节点弹出来
    node = node.right; // 并将指针指向这个节点的右子树
  }
  return res
};

console.log(preorderTraversal(root))